package com.itany.nmms.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itany.nmms.constant.DictConstant;
import com.itany.nmms.constant.StatusConstant;
import com.itany.nmms.dao.ProductTypeMapper;
import com.itany.nmms.entity.ProductType;
import com.itany.nmms.entity.ProductTypeExample;
import com.itany.nmms.exception.ProductTypeExistException;
import com.itany.nmms.exception.ProductTypeNotExistException;
import com.itany.nmms.exception.RequestParameterErrorException;
import com.itany.nmms.factory.ObjectFactory;
import com.itany.nmms.service.ProductTypeService;
import com.itany.nmms.util.ParameterUtil;

import java.util.List;

/**
 * @Author:石小俊
 * @Date:2023/1/4 11:17
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
public class ProductTypeServiceImpl implements ProductTypeService {
    @Override
    public void addType(String name) throws RequestParameterErrorException, ProductTypeExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(name)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 商品类型的名称不能重复
        // 判断当前商品类型是否已经存在
        // 根据类型名查询类型信息
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name);
        List<ProductType> types = typeMapper.selectByExample(example);
        if(!types.isEmpty()){
            // 如果已经存在,抛出异常
            throw new ProductTypeExistException("该商品类型已经存在");
        }

        // 如果尚未添加过该类型,则进行添加
        ProductType type = new ProductType();
        type.setName(name);
        // 对于状态,真实开发中默认一般给禁用
        // 添加成功之后,走流程,流程走完改为启用
        // 此次练习没有流程功能,可以默认直接给启用,便于测试
        type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        // 添加类型
        typeMapper.insertSelective(type);
    }

    @Override
    public PageInfo<ProductType> findPage(String pageNo, String pageSize) {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        // 对于分页信息,需要进行处理
        // 前端页面可能并没有传递页码相关信息
        // 因此,后端需要设置默认值
        if(ParameterUtil.isNull(pageNo)){
            // 默认显示第一页
            pageNo = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_NO;
        }
        if(ParameterUtil.isNull(pageSize)){
            // 默认每页的数量
            pageSize = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_SIZE;
        }

        // 开始分页,使用PageHelper分页插件进行分页
        // 导入对应jar包,在mybatis-config.xml中配置插件
        // 分页共分为三步
        // 1.设置分页信息
        // 参数一:第几页
        // 参数二:每页多少条数据
        // 执行完此行代码之后,后面的所有业务数据均会被分页
        // 因此,如果某些数据不需要分页,则请在此行代码之前操作
        PageHelper.startPage(Integer.parseInt(pageNo),Integer.parseInt(pageSize));

        // 2.获取业务数据
        // 在此处获取的业务数据将会被分页
        List<ProductType> types = typeMapper.selectByExample(new ProductTypeExample());

        // 3.封装分页对象PageInfo
        PageInfo<ProductType> typePage = new PageInfo<>(types);

        return typePage;
    }

    @Override
    public ProductType findById(String id) throws RequestParameterErrorException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        if(null == type){
            throw new RequestParameterErrorException("请求参数有误");
        }
        return type;
    }

    @Override
    public void modifyName(String id, String name) throws RequestParameterErrorException, ProductTypeExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(id) || ParameterUtil.isNull(name)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 判断修改后的商品类型是否已经存在
        // 修改时可以不改名称,当不改名称时数据库中会存在该类型
        // 只有满足以下两个条件,抛出异常
        // 1.该类型在数据库中已经存在
        // 2.该类型不是原有的类型名
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name)
                .andIdNotEqualTo(Integer.parseInt(id));
        List<ProductType> types = typeMapper.selectByExample(example);
        if(!types.isEmpty()){
            throw new ProductTypeExistException("该商品类型已经存在");
        }

        // 开始修改
        ProductType type = new ProductType();
        type.setId(Integer.parseInt(id));
        type.setName(name);
        // 使用动态sql进行修改
        typeMapper.updateByPrimaryKeySelective(type);
    }

    @Override
    public void modifyStatus(String id) throws RequestParameterErrorException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 根据主键查询当前商品类型信息
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        // 判断当前商品类型的状态
        // 如果当前状态为启用
        if(type.getStatus().equals(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED)){
            // 将其改为禁用
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_DISABLED);
        } else{
            // 否则改为启用
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        }
        // 执行修改
        typeMapper.updateByPrimaryKeySelective(type);
    }

    @Override
    public List<ProductType> findEnable() throws ProductTypeNotExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andStatusEqualTo(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        List<ProductType> types = typeMapper.selectByExample(example);
        if(types.isEmpty()){
            throw new ProductTypeNotExistException("没有可用的商品类型,请先启用");
        }
        return types;
    }
}
